package util

import (
	"gitee.com/swsk33/gopher-fetch"
	"gitee.com/swsk33/sclog"
	"gitee.com/swsk33/sentinel-fetch/api"
	"gitee.com/swsk33/sentinel-fetch/global"
	"time"
)

// 管理和刷新Token的实用类

// GetToken 登录并设定Token
//
// - notify 是否显示消息
func GetToken(notify bool) error {
	// 请求Token
	result, e := api.LoginAndGetToken(global.TotalConfig.Auth.Username, global.TotalConfig.Auth.Password)
	if e != nil {
		sclog.ErrorLine(e.Error())
		return e
	}
	// 设定Token
	gopher_fetch.GlobalConfig.Headers["Authorization"] = "Bearer " + result.AccessToken
	global.RefreshToken = result.RefreshToken
	if notify {
		sclog.InfoLine("已登录并获取Token！")
	}
	return nil
}

// RefreshToken 刷新并设定Token
//
// - notify 是否显示消息
func RefreshToken(notify bool) error {
	// 请求Token
	result, e := api.RefreshToken(global.RefreshToken)
	if e != nil {
		sclog.ErrorLine(e.Error())
		return e
	}
	// 设定Token
	gopher_fetch.GlobalConfig.Headers["Authorization"] = "Bearer " + result.AccessToken
	global.RefreshToken = result.RefreshToken
	if notify {
		sclog.InfoLine("已刷新Token！")
	}
	return nil
}

// 用于自动刷新Token的定时任务对象
var tokenTicker *time.Ticker

// EnableTokenRefresh 开启Token自动刷新
func EnableTokenRefresh() error {
	// 先执行登录
	e := GetToken(true)
	if e != nil {
		sclog.ErrorLine(e.Error())
		return e
	}
	// 开启定时器
	tokenTicker = time.NewTicker(6 * time.Minute)
	go func() {
		for range tokenTicker.C {
			e = RefreshToken(false)
			if e != nil {
				sclog.ErrorLine(e.Error())
			}
		}
	}()
	sclog.InfoLine("已开启Token自动刷新！")
	return nil
}

// DisableTokenRefresh 关闭Token自动刷新
func DisableTokenRefresh() {
	tokenTicker.Stop()
	sclog.InfoLine("已停止Token自动刷新！")
}